import axios from 'axios'
import NProgress from 'nprogress' // 引入nprogress插件
import { WHITE_LIST } from './config'
import 'nprogress/nprogress.css' // 这个nprogress样式必须引入
import type { AxiosRequestConfig, AxiosInstance } from 'axios'
import type { LtAxiosRequestConfig, LtInternalAxiosRequestConfig } from './type'
class LtRequest {
  instance: AxiosInstance
  constructor(config: AxiosRequestConfig) {
    this.instance = axios.create({
      withCredentials: true, // 确保跨域请求时发送cookie
      ...config
    })
    // 请求拦截器
    this.instance.interceptors.request.use(
      function (config: LtInternalAxiosRequestConfig) {
        NProgress.start()
        // 设置token
        if (!WHITE_LIST.includes(config.url as string)) {
          config.headers.token = localStorage.getItem('token')
        }
        return config
      },
      function (error) {
        // 对请求错误做些什么
        NProgress.done()
        return Promise.reject(error)
      }
    )
    // 添加响应拦截器
    this.instance.interceptors.response.use(
      function (response) {
        // 2xx 范围内的状态码都会触发该函数。
        NProgress.done()
        return response.data.data
      },
      function (error) {
        // 超出 2xx 范围的状态码都会触发该函数。
        NProgress.done()
        console.log(error.response.data)
        if (error.response.data.data) {
          ElMessage.error(error.response.data.data)
        } else {
          ElMessage.error('请求错误')
        }
        return Promise.reject(error)
      }
    )
  }
  request(config: LtAxiosRequestConfig) {
    return this.instance.request(config)
  }
  get(config: LtAxiosRequestConfig) {
    return this.instance({ ...config, method: 'GET' })
  }
  post(config: LtAxiosRequestConfig) {
    return this.instance({ ...config, method: 'POST' })
  }
  delete(config: LtAxiosRequestConfig) {
    return this.instance({ ...config, method: 'DELETE' })
  }
}

export default LtRequest
